package com.putige.reggie.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.putige.reggie.common.R;
import com.putige.reggie.entity.Category;
import com.putige.reggie.entity.Dish;
import com.putige.reggie.dto.DishDto;
import com.putige.reggie.entity.DishFlavor;
import com.putige.reggie.service.CategoryService;
import com.putige.reggie.service.DishFlavorService;
import com.putige.reggie.service.DishService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 菜品管理
 */
@RestController
@RequestMapping("/dish")
@Slf4j
public class DishController {

    @Autowired
    private DishService dishService;

    @Autowired
    private DishFlavorService dishFlavorService;

    @Autowired
    private CategoryService categoryService;

    /**
     * 新增菜品
     *
     * @param dishDto
     * @return
     */
    @PostMapping
    public R add(@RequestBody DishDto dishDto) {
        //检查参数
        if (dishDto == null) {
            return R.error("参数异常!");
        }
        //调用dishservice接口添加数据
        boolean dish = dishService.addByIdFlavor(dishDto);
        if (dish == false) {
            return R.error("添加失败!");
        }
        return R.success("新增成功!");
    }

    /**
     * 分页查询 , 需要展示出菜品以及对应的口味
     *
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @GetMapping("/page")
    public R<Page> findByPageAndName(Integer page, Integer pageSize, String name) {
        //检查参数
        if (page <= 0 || pageSize <= 0) {
            return null;//参数异常!
        }

        //调用service查询
        Page<DishDto> dishDtos = dishService.findByPageAndName(page, pageSize, name);
        if (dishDtos == null) {
            return R.error("查询失败!");
        }
        return R.success(dishDtos);
    }

    /**
     * 回显数据
     *
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public R findId(@PathVariable Long id) {
        //检查参数
        if (id == null) {
            return R.error("参数异常!");
        }
        //调用dishService接口方法回显数据
        DishDto dishDto = dishService.findId(id);
        //判断如果查询到的对象为空
        if (dishDto == null) {
            return R.error("回显失败!该ID对象不存!");
        }
        return R.success(dishDto);
    }

    /**
     * 修改菜品信息 ,前端传入的对象是带有菜品味道的,所以是修改DishDto对象
     *
     * @param dishDto
     * @return
     */
    @PutMapping
    public R update(@RequestBody DishDto dishDto) {
        //检查参数
        if (dishDto == null) {
            return R.error("参数异常!");
        }
        //调用service接口方法修改数据
        boolean flag = dishService.updateByDish(dishDto);
        if (flag == false) {
            return R.error("修改失败,请重试!");
        }
        return R.success("修改成功!");
    }

    /**
     * 批量删除
     *
     * @param ids
     * @return
     */
    @DeleteMapping
    public R deleted(Long[] ids) {
        //检查参数
        if (ids.length <= 0) {
            return null;
        }
        boolean flag = dishService.deleted(ids);

        if (flag == false) {
            return R.error("删除失败!");
        }
        return R.success("删除成功!");
    }

    /**
     * 批量停售
     * 将status状态修改为0
     * <p>
     * 批量起售
     * * status 状态为 设置为1
     *
     * @param ids
     * @return
     */
    @PostMapping("/status/{status}")
    public R stopStatus(@PathVariable Integer status, Long[] ids) {
        //检查参数
        if (ids == null || (ids.length <= 0) || status == null) {
            return null;  //参数异常
        }
        boolean flag = dishService.updateByIds(status, ids);
        if (flag) {
            return R.success("已经批量停售!");
        }
        return R.error("批量停售失败!");
    }

    /* *//**
     * 回显数据
     *
     * @param dish
     * @return
     *//*
    @GetMapping("/list")
    public R list(Dish dish) {
        //检查参数
        if (dish == null) {
            return null;
        }
        //构件查询条件
        LambdaQueryWrapper<Dish> wraper = new LambdaQueryWrapper<>();
        //当传入的id不为空,且比较数据库的菜品分类id=传入的id
        wraper.eq(dish.getCategoryId() != null,
                Dish::getCategoryId, dish.getCategoryId());
        //添加条件,查询状态为1(起售)的菜品
        wraper.eq(Dish::getStatus, 1);
        //根据条件排序
        wraper.orderByAsc(Dish::getSort).orderByAsc(Dish::getUpdateTime);
        List<Dish> list = dishService.list(wraper);
        return R.success(list);
    }*/

    //展示app数据修改上列list方法

    /**
     * 数据展示
     *
     * @param dish
     * @return
     */
    @GetMapping("/list")
    public R list(Dish dish) {
        //检查参数
        if (dish == null) {
            return null;
        }
        //构件查询条件
        LambdaQueryWrapper<Dish> wraper = new LambdaQueryWrapper<>();
        //当传入的id不为空,且比较数据库的菜品分类id=传入的id
        wraper.eq(dish.getCategoryId() != null,
                Dish::getCategoryId, dish.getCategoryId());
        //添加条件,查询状态为1(起售)的菜品
        wraper.eq(Dish::getStatus, 1);
        //根据条件排序
        wraper.orderByAsc(Dish::getSort).orderByAsc(Dish::getUpdateTime);
        List<Dish> list = dishService.list(wraper);
        List<DishDto> dishDtoList = list.stream().map((s) -> {
            //创建一个dishDto对象
            DishDto dishDto = new DishDto();
            //把dish集合里面的dish对象封住到dto
            BeanUtils.copyProperties(s, dishDto);
            //分类的id
            Long categoryId = s.getCategoryId();
            //根据分类的id查询分类对象
            Category category = categoryService.getById(categoryId);
            //当对象不为null,把分类对象的名字设置到Dto
            if (category != null) {
                String name = category.getName();
                dishDto.setCategoryName(name);
            }
            //当前菜品的id
            Long dishId = s.getId();
            LambdaQueryWrapper<DishFlavor> dishWrapper = new LambdaQueryWrapper<>();
            //设置口味信息,id
            dishWrapper.eq(DishFlavor::getDishId, dishId);
            List<DishFlavor> list1 = dishFlavorService.list(dishWrapper);
            dishDto.setFlavors(list1);
            return dishDto;
        }).collect(Collectors.toList());

        return R.success(dishDtoList);
    }

}